home *** CD-ROM | disk | FTP | other *** search
/ Freelog 100 / FreelogNo100-NovembreDecembre2010.iso / Musique / solfege / solfege-win32-3.17.0.exe / {app} / bin / Lib / compiler / misc.py < prev    next >
Text File  |  2005-11-28  |  2KB  |  74 lines

  1.  
  2. def flatten(tup):
  3.     elts = []
  4.     for elt in tup:
  5.         if isinstance(elt, tuple):
  6.             elts = elts + flatten(elt)
  7.         else:
  8.             elts.append(elt)
  9.     return elts
  10.  
  11. class Set:
  12.     def __init__(self):
  13.         self.elts = {}
  14.     def __len__(self):
  15.         return len(self.elts)
  16.     def __contains__(self, elt):
  17.         return self.elts.has_key(elt)
  18.     def add(self, elt):
  19.         self.elts[elt] = elt
  20.     def elements(self):
  21.         return self.elts.keys()
  22.     def has_elt(self, elt):
  23.         return self.elts.has_key(elt)
  24.     def remove(self, elt):
  25.         del self.elts[elt]
  26.     def copy(self):
  27.         c = Set()
  28.         c.elts.update(self.elts)
  29.         return c
  30.  
  31. class Stack:
  32.     def __init__(self):
  33.         self.stack = []
  34.         self.pop = self.stack.pop
  35.     def __len__(self):
  36.         return len(self.stack)
  37.     def push(self, elt):
  38.         self.stack.append(elt)
  39.     def top(self):
  40.         return self.stack[-1]
  41.     def __getitem__(self, index): # needed by visitContinue()
  42.         return self.stack[index]
  43.  
  44. MANGLE_LEN = 256 # magic constant from compile.c
  45.  
  46. def mangle(name, klass):
  47.     if not name.startswith('__'):
  48.         return name
  49.     if len(name) + 2 >= MANGLE_LEN:
  50.         return name
  51.     if name.endswith('__'):
  52.         return name
  53.     try:
  54.         i = 0
  55.         while klass[i] == '_':
  56.             i = i + 1
  57.     except IndexError:
  58.         return name
  59.     klass = klass[i:]
  60.  
  61.     tlen = len(klass) + len(name)
  62.     if tlen > MANGLE_LEN:
  63.         klass = klass[:MANGLE_LEN-tlen]
  64.  
  65.     return "_%s%s" % (klass, name)
  66.  
  67. def set_filename(filename, tree):
  68.     """Set the filename attribute to filename on every node in tree"""
  69.     worklist = [tree]
  70.     while worklist:
  71.         node = worklist.pop(0)
  72.         node.filename = filename
  73.         worklist.extend(node.getChildNodes())
  74.